#include<bits/stdc++.h>

using namespace std;

struct Node {
    int pos = 0;
    int visited = 0; // 以 特 定 顶 点 起 始 的 不 可 访 问 // 可用全局visited[]数组替代其功能
    int num = 0; // 被 调 用 的 层 数
    list<int> lst; // 边 列 表
};

int main() {
    int n;
    cin >> n;
    int tmp1 = n + 1;
    Node *G = new Node[tmp1];
    int x, y;
    int sum = 0; // 总 数
    for (int i = 0; i < n - 1; ++i) {
        // 初 始 化 边 信 息
        cin >> x >> y;
        G[x].pos = x;
        G[x].lst.push_back(y);
        G[y].pos = y;
        G[y].lst.push_back(x);
    }

    for (int i = 1; i < n + 1; ++i) {
        // 对于每一个点进行广搜，即每个点的层次数的基准是大循环的第i个结点
        G[i].num = 0;
        G[i].visited = i; // 自 身 不 可 访 问
        queue<Node> q;
        q.push(G[i]);
        while (!q.empty()) {// 广搜
            Node tmp = q.front();
            q.pop();
            if (tmp.num != 3) {
                for (auto j: tmp.lst) {
                    if (G[j].visited != i) {
                        G[j].visited = i; // 不 可 访 问
                        G[j].num = tmp.num + 1; // 更 深 一 层
                        q.push(G[j]);
                    }
                }
            } else if (tmp.num == 3) {
                if (find(tmp.lst.begin(), tmp.lst.end(), i) == tmp.lst.end())// 相对层次数为3，判断是否与基准点相连
                {
                    ++sum;

                    G[i].lst.push_back(tmp.pos);
                    G[i].visited = i;
                    G[tmp.pos].lst.push_back(i);
                    G[tmp.pos].num = 1;// 因为相连，所以此点的相对基准点层次数置为1，解决了增解情况！
                    q.push(G[tmp.pos]);// 因为此点属性发生改变，我们将它重新入队
                }
            }
        }
    }
    printf("%d", sum);
    delete[] G;
    return 0;

    return 0;
}